package com.advanced.strategy;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 对分片键的前加上库位，避免扩容库表后的数据迁移
 */
public class CreateCodePrefixDbConfig {

    /**
     * 存储库前缀集合
     */
    private static List<String> partitionDbPrefixList = new ArrayList<>();

    private static Random random = new Random();
    /**
     * 向集合中添加现有的库前缀，有3个库分别是0，1，a，所以集合就暂时存0,1,a
     * 该集合的作用就是随机把数据分派到某个库，由于3个库随机到的概率相同，所以数据量不会差太多
     */
    static {
        partitionDbPrefixList.add("0");
        partitionDbPrefixList.add("1");
        partitionDbPrefixList.add("a");
    }

    /**
     * 该集合是--->当要对库扩容的时候，无需迁移数据，只需设置权重即可，新库被随到的概率大于旧库，这样可以均衡刚扩容后的新旧库数据量差距大
     *
     * 该方法是最简单，最low的，如果想更华丽，可以借助redis，或者其他算法
     */
//    static {
//        partitionDbPrefixList.add("0");
//        partitionDbPrefixList.add("1");
//        partitionDbPrefixList.add("a");
//        partitionDbPrefixList.add("e");
//        partitionDbPrefixList.add("e");
//        partitionDbPrefixList.add("f");
//        partitionDbPrefixList.add("f");
//    }

    public static String getPartitionDbPrefix(){
        int prefix = random.nextInt(partitionDbPrefixList.size());
        return partitionDbPrefixList.get(prefix);
    }

}
